package com.dubbo.service.impl.base;

import com.dubbo.service.base.BaseService;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.List;

/**
 * 通用mapper自定义方法
 * @author chenwei
 * @date 2018年2月26日 下午12:01:09
 * @param <T>
 */
//@Service
//@Transactional(readOnly=false)
public class BaseServiceImpl<T> implements BaseService<T> {
	/** 注入通用Mapper */
	@Autowired
	private Mapper<T> mapper;
	/** 定义T对应的class类型 */
	private Class<T> entityClass;
	
	/** 在构造中初始化entityClass */
	@SuppressWarnings("unchecked")
	public BaseServiceImpl(){
		/** 获取父接口中泛型的参数类型 BaseService<T> */
		ParameterizedType parameterizedType = (ParameterizedType)this.getClass()
				.getGenericSuperclass();
		/** 获取泛型的参数的实际类型 */
		entityClass = (Class<T>)parameterizedType.getActualTypeArguments()[0];
	}
	
	/** 选择性添加 */
	public void insertSelective(T entity){
		mapper.insertSelective(entity);
	}
	/** 选择性修改 */
	public void updateSelective(T entity){
		mapper.updateByPrimaryKeySelective(entity);
	}
	/** 根据主键id删除 */
	public void delete(Serializable id){
		mapper.deleteByPrimaryKey(id);
	}
	
	/** 批量删除 */
	public void deleteBatch(String idField, Serializable[] ids){
		// delete from item where id in(?,?,?)
		/** 创建Example示范对象，封装where条件 */
		Example example = new Example(entityClass);
		/** 创建条件对象 */
		Criteria criteria = example.createCriteria();
		/** 封装条件 */
		criteria.andIn(idField, Arrays.asList(ids));
		mapper.deleteByExample(example);
	}
	
	/** 根据主键id查询 */
	public T selectOne(Serializable id){
		return mapper.selectByPrimaryKey(id);
	}
	
	/** 根据全部 */
	public List<T> selectAll(){
		return mapper.selectAll();
	}
	
	/** 等于号条件查询 */
	public List<T> selectByWhere(T entity){
		return mapper.select(entity);
	}
	
	/** 分页查询 */
	public List<T> selectByPage(Integer pageNum, Integer pageSize){
		/** 开启分页 */
		PageHelper.startPage(pageNum, pageSize);
		return mapper.selectAll();
	}
	
	/** 等于号条件统计查询  */
	public Integer countByWhere(T entity){
		return mapper.selectCount(entity);
	}
}
